/**
  ******************************************************************************
  * @file    stepper_motor.h
  * @brief   串口步进电机控制协议驱动头文件
  *          USART6
  ******************************************************************************
  */

#ifndef __STEPPER_MOTOR_H
#define __STEPPER_MOTOR_H


/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include <string.h>

// 电机数据请求命令
static uint8_t motor1_request[] = {0x7B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x7D};
static uint8_t motor2_request[] = {0x7B, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x7D};

// 接收缓冲区（电机返回9字节数据）
static uint8_t rx_buffer[9];
static uint8_t rx_index = 0;
static uint8_t rx_complete = 0;

extern UART_HandleTypeDef huart2;

/** @defgroup 步进电机协议数据类型
  * @{
  */
typedef enum
{
    STEP_ID1  = 0x01,  /* 速度控制模式 */
		STEP_ID2  = 0x02
} StepMotor_ID;

/** @defgroup 步进电机协议数据类型
  * @{
  */
typedef enum
{
    STEP_MODE_SPEED    = 0x01U,  /* 速度控制模式 */
    STEP_MODE_POSITION = 0x02U,  /* 位置控制模式 */
    STEP_MODE_TORQUE   = 0x03U,  /* 力矩控制模式 */
    STEP_MODE_ANGLE    = 0x04U   /* 单圈绝对角度控制模式 */
} StepMode_t;

typedef struct
{
    StepMode_t mode;     /* 控制模式 */
		uint8_t  motor_num;
    uint8_t  dir;        /* 0-逆时针 1-顺时针 */
    uint8_t  micro;      /* 细分值 2/4/8/16/32 */
    int16_t  posH;       /* 位置/角度/电流 高8位 */
    int16_t  posL;       /* 位置/角度/电流 低8位 */
    int16_t  speedH;     /* 转速 高8位 */
    int16_t  speedL;     /* 转速 低8位 */
} StepMotorFrame_t;

/**外部接口**/
static uint8_t CalcBCC(const uint8_t *buf, uint8_t len);
void STEP_USART2_SendFrame(StepMotorFrame_t *frame);
void STEP_MotorCtrl(uint8_t num, StepMode_t mode, uint8_t dir, uint8_t micro, int16_t posVal,int16_t speed);
void Motor_RequestData(StepMotor_ID motor_ID);
short Parse_MotorData(void);
void STEPMotor_Reset(void);
/* 带超时检测的步进电机控制 */
void STEP_MotorCtrl_WithCheck(StepMotor_ID num,
                              StepMode_t mode,
                              uint8_t dir,
                              uint8_t micro,
                              int16_t posVal,
                              int16_t speed);
#endif
